package models;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Transient;

import net.sf.oval.constraint.ValidateWithMethod;

import org.hibernate.annotations.Cascade;

import play.data.validation.Max;
import play.data.validation.Min;
import play.data.validation.Required;
import play.db.jpa.Model;

@Entity
public class TemplatePlan extends Model {
    
	private static final long serialVersionUID = -531148556700202414L;

	@Required
	private String nombre;
	
	@Required
	@Min(value=500)
	@Max(value=10000)
	private Integer caloriasDiarias = 2000;
	
	@ManyToOne
	private Nutri autor;
	
	@Enumerated(EnumType.STRING)
	@Required
	private VisibilidadTemplatePlan visibilidad = VisibilidadTemplatePlan.NADIE;
	
	@SuppressWarnings("deprecation")
	@OneToMany(cascade=CascadeType.ALL)
	@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@ValidateWithMethod(methodName="validarPorcionesPorComida", parameterType=List.class, message="plan.sinPorciones")
	private List<ComidaPlan> comidasPlan = new ArrayList<ComidaPlan>();
	
	@Enumerated(EnumType.STRING)
	@Required
	private TipoPlan tipo;
	
	@Transient
	private Boolean temporal;
	
	public void inicializarCon6Comidas() {
		
		for (TipoComida tipoComida : TipoComida.values()) {
			
			ComidaPlan comidaPlan = new ComidaPlan();
			
			comidaPlan.setTipo(tipoComida);
			
			this.agegarComidaPlan(comidaPlan);
		}
		
	}
	
	public String getNombre() {
		return nombre;
	}
	
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	public Integer getCaloriasDiarias() {
		return caloriasDiarias;
	}
	
	public void setCaloriasDiarias(Integer caloriasDiarias) {
		this.caloriasDiarias = caloriasDiarias;
	}
	
	public Nutri getAutor() {
		return autor;
	}
	
	public void setAutor(Nutri autor) {
		this.autor = autor;
	}
	
	public List<ComidaPlan> getComidasPlan() {
		return comidasPlan;
	}
	
	public void setComidasPlan(List<ComidaPlan> comidasPlan) {
		this.comidasPlan = comidasPlan;
	}
	
	public TipoPlan getTipo() {
		return tipo;
	}
	
	public void setTipo(TipoPlan tipo) {
		this.tipo = tipo;
	}
	
	public VisibilidadTemplatePlan getVisibilidad() {
		return visibilidad;
	}
	
	public void setVisibilidad(VisibilidadTemplatePlan visibilidad) {
		this.visibilidad = visibilidad;
	}
	
	public void agegarComidaPlan(ComidaPlan comidaPlan) {
		this.comidasPlan.add(comidaPlan);
	}
	
	public boolean validarPorcionesPorComida(List<ComidaPlan> comidasPlan) {
		
		for (ComidaPlan comidaPlan : comidasPlan) {
			if(comidaPlan.getPorciones().isEmpty()) {
				return false;
			}
		}
		
		return true;
	}
	
	public Boolean getTemporal() {
		return temporal;
	}
	
	public void setTemporal(Boolean temporal) {
		this.temporal = temporal;
	}
	
}
